home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / bisicc.arc / CC.C next >
Text File  |  1985-06-26  |  10KB  |  462 lines

  1. /*        cc.c        program to simulate (sortof) the cc command in Unix
  2.  
  3.         usage:    cc [flags] file ...
  4.             flags:    all C86 flags are passed thru directly except -c.
  5.                 
  6.                 -c            compile only, don't link                  
  7.                 -lpath    path/name of new lib to add to lib list
  8.                 -C            nested comments (-c for compiler)
  9.                 -o file    name of output.exe, assumed first name in list
  10.                 -M file    name of map file (linker)
  11.                 -H         /h option (linker)
  12.                 -D            /d option (linker)
  13.                 -L            /l option (linker)
  14.                 -P            /p option (linker)
  15.                 -S size    /s option (linker)
  16.                 -A            /a option (assembler)
  17.                 -B            /d option (assembler)
  18.                 -E            /e option (assembler)
  19.                 -N            /n option (assembler)
  20.                 -O            /o option (assembler)
  21.                 -R            /r option (assembler)
  22.                 -F            /X    option (assembler)
  23.                 -X name    name for CREF file (assembler)
  24.  
  25.                 may have multiple files in list and they can contain
  26.                 wildcards.
  27. */
  28.  
  29. #include <stdio.h>
  30. #include <ctype.h>
  31.  
  32. #define TRUE -1
  33. #define FALSE 0
  34. /* flags */
  35. /* internal */
  36. int link=TRUE;
  37. char libs[255] = "\0";
  38. /* compiler */
  39. int cf1=FALSE;
  40. int cf2=FALSE;
  41. int cfa=FALSE;
  42. int cfb=FALSE;
  43. int cfc=FALSE;
  44. char cfd[255];        
  45. int cfe=FALSE;
  46. int cfh=FALSE;
  47. int cfi=FALSE;
  48. int cfj=FALSE;
  49. int cfn=FALSE;
  50. int cfp=FALSE;
  51. int cfs=FALSE;
  52. int cft=FALSE;
  53. int cfu=FALSE;
  54. /* linker */
  55. int lfh=FALSE;
  56. int lfd=FALSE;
  57. int lfl=FALSE;
  58. int lfp=FALSE;
  59. int lfs=FALSE;
  60. /* assembler */
  61. int afa=FALSE;
  62. int afb=FALSE;
  63. int afe=FALSE;
  64. int afn=FALSE;
  65. int afo=FALSE;
  66. int afr=FALSE;
  67. int aff=FALSE;
  68.  
  69. char outfile[255] = "\0";
  70. char mapfile[255] = "\0";
  71. char creffile[255] = "\0";
  72.  
  73. char biglib[255] = "/lib/c86b2s.lib";
  74. char smllib[255] = "/lib/c86s2s.lib";
  75. char include[255] = "/lib/";
  76.  
  77. char copts[255] = "\0";
  78. char aopts[255] = "\0";
  79. char lopts[255] = "\0";
  80.  
  81. main(ac,av)    
  82. int ac;
  83. char *av[];
  84. {
  85.     char *s;
  86.     char *ts;
  87.     int i,nd,j,nf;
  88.     char *filelist[30];
  89.     char tstr[255];
  90.     char *first,*next;
  91.     char *switchar();
  92.  
  93.     nd=0;
  94.     while(--ac > 0 && (*++av)[0] == '-') {
  95.         for (s = av[0]+1; *s != '\0'; s++) {
  96.             switch (*s) {
  97.             case '1':        /* 80186 code */
  98.                 cf1=TRUE;
  99.                 strcat(copts,"-1");
  100.                 break;
  101.             case '2':        /* 80286 code */
  102.                 cf2=TRUE;
  103.                 strcat(copts,"-2");
  104.                 break;
  105.             case 'a':        /* gen asm */
  106.                 cfa=TRUE;
  107.                 strcat(copts,"-a ");
  108.                 break;
  109.             case 'A':        /* */
  110.                 afa=TRUE;
  111.                 strcat(aopts,switchar());
  112.                 strcat(aopts,"A");
  113.                 break;
  114.             case 'b':        /* big model */
  115.                 cfb=TRUE;
  116.                 strcat(copts,"-b ");
  117.                 break;
  118.             case 'B':        /* both passes */
  119.                 afb=TRUE;    /* gens a -D */
  120.                 strcat(aopts,switchar());
  121.                 strcat(aopts,"D");
  122.                 break;
  123.             case 'c':        /* compile only */
  124.                 link = FALSE;
  125.                 break;
  126.             case 'C':        /* nested comments */
  127.                 cfc=TRUE;
  128.                 strcpy(copts,"-c ");
  129.                 break;
  130.             case 'd':        /* compiler define */
  131.                 ts = ++s;
  132.                 while(*++s != ' ');
  133.                 *s++ = '\0';
  134.                 strcpy(cfd,ts);
  135.                 strcat(copts,"-d ");
  136.                 strcat(copts,cfd);
  137.                 strcat(copts," ");
  138.                 break;        
  139.             case 'D':        /* */
  140.                 lfd=TRUE;
  141.                 strcat(lopts,switchar());
  142.                 strcat(lopts,"D");
  143.                 break;
  144.             case 'e':        /* */
  145.                 cfe = TRUE;
  146.                 strcat(copts,"-e ");
  147.                 break;
  148.             case 'E':
  149.                 afe=TRUE;
  150.                 strcat(aopts,switchar());
  151.                 strcat(aopts,"E");
  152.                 break;
  153.             case 'F':
  154.                 aff=TRUE;    /* to /x */
  155.                 strcat(aopts,switchar());
  156.                 strcat(aopts,"X");
  157.                 break;
  158.             case 'h':
  159.                 ts=++s;
  160.                 cfh = TRUE;
  161.                 while(*++s != ' ');
  162.                 *s++ = '\0';
  163.                 strcat(copts,"-h");
  164.                 strcat(copts,ts);
  165.                 break;
  166.             case 'H':
  167.                 lfh=TRUE;
  168.                 strcat(lopts,switchar());
  169.                 strcat(lopts,"H");
  170.                 break;
  171.             case 'i':
  172.                 cfi=TRUE;
  173.                 strcat(copts,"-i ");
  174.                 break;
  175.             case 'j':
  176.                 ts=++s;
  177.                 *++s = '\0';
  178.                 strcat(copts,"-j");
  179.                 strcat(copts,ts);
  180.                 strcat(copts," ");
  181.                 break;
  182.             case 'l':
  183.                 ts=++s;
  184.                 while(*++s != ' ');
  185.                 *s++ = '\0';
  186.                 strcat(libs,ts);
  187.                 strcat(libs,"+");
  188.                 break;
  189.             case 'L':
  190.                 lfl=TRUE;
  191.                 strcat(lopts,switchar());
  192.                 strcat("L");
  193.                 break;
  194.             case 'M':
  195.                 ts=++s;
  196.                 while (*++s != ' ');
  197.                 *s++ = '\0';
  198.                 strcpy(mapfile,ts);
  199.                 break;
  200.             case 'n':
  201.                 cfn=TRUE;
  202.                 strcat(copts,"-n ");
  203.                 break;
  204.             case 'o':
  205.                 ts=++s;
  206.                 while (*++s != ' ');
  207.                 *s++ = '\0';
  208.                 strcpy(outfile,ts);
  209.                 break;
  210.             case 'O':
  211.                 afo=TRUE;
  212.                 strcat(aopts,switchar());
  213.                 strcat(aopts,"O");
  214.                 break;
  215.             case 'p':
  216.                 cfp=TRUE;
  217.                 strcat(copts,"-p ");
  218.                 break;
  219.             case 'P':
  220.                 lfp=TRUE;
  221.                 strcat(lopts,switchar());
  222.                 strcat(lopts,"P");
  223.                 break;
  224.             case 'R':
  225.                 afr=TRUE;
  226.                 strcat(aopts,switchar());
  227.                 strcat(aopts,"R");
  228.                 break;
  229.             case 's':
  230.                 cfs=TRUE;
  231.                 strcat(copts,"-s ");
  232.                 break;
  233.             case 't':
  234.                 cft=TRUE;
  235.                 strcat(copts,"-t ");
  236.                 break;
  237.             case 'u':
  238.                 cfu=TRUE;
  239.                 strcat(copts,"-u ");
  240.                 break;
  241.             case 'X':
  242.                 ts=++s;
  243.                 while (*++s != ' ');
  244.                 *s++ = '\0';
  245.                 strcpy(creffile,ts);
  246.             }
  247.         }
  248.     }
  249.     if (ac < 1) usage();                    /* not enough args */
  250.  
  251.     readenv();                                /* get environment info */
  252.  
  253.     if (!cfh) {                                /* where to find includes */
  254.         strcat(copts,"-h");                /* if they don't spec them */
  255.         strcat(copts,include);
  256.     }
  257.     for (i=0;i<30;i++) 
  258.         filelist[i] = alloc(128);        /* grab space for the filenames */
  259.  
  260.     /* parse off filenames */
  261.  
  262.     for (i=nf=0;i<ac;i++) {
  263.         if (strchr(av[i],'*') || strchr(av[i],'?')) {     /* any wildcards? */
  264.             strcpy(tstr,av[i]);
  265.             first = filedir(tstr,0);
  266.             for(next=first;*next != '\0';) {
  267.                 strcpy(filelist[nf++],lower(next));
  268.                 next += strlen(next)+1;
  269.             }
  270.             free(first);
  271.         } 
  272.         else {
  273.             strcpy(filelist[nf++],lower(av[i]));            /* no wildcards */
  274.         }
  275.     }
  276.  
  277.     /* now have a list of files to compile, assemble and/or link */
  278.     /* test them for validity and compile them */
  279.             
  280.     for (i=0;i<nf;i++) {
  281.         if (!(ts=strrchr(filelist[i],'.'))) {    /* no ext? */
  282.             strcat(filelist[i],".c");                /* tack on the default */
  283.         }
  284.         if (strcmp(strrchr(filelist[i],'.'),".c")==0) {
  285.             _cc(filelist[i]);                            /* compile it */
  286.         } 
  287.         else if (strcmp(strrchr(filelist[i],'.'),".asm")==0)    {  
  288.             _as(filelist[i]);                            /* assemble it */
  289.         }
  290.         else if (strcmp(strrchr(filelist[i],'.'),".obj")!=0) {
  291.             fputs(filelist[i],stderr);
  292.             fubar("invalid file type ",filelist[i]);
  293.         }
  294.     }
  295.  
  296.     /* done compiling/assembling, time to link */
  297.  
  298.     if (link) {
  299.         if (*outfile == '\0') {                    /* no -o spec, */
  300.             strcpy(outfile,filelist[0]);        /* assume 1st file in list */
  301.             ts = strrchr(outfile,'.');
  302.             *ts = '\0';                                  /* zap ext */
  303.         }                                
  304.         _link(outfile,filelist,nf);
  305.     }
  306.     puts("\ndone.");
  307.     exit(0);
  308. }
  309.  
  310. char *switchar()
  311. {
  312.     struct regs {int ax,bx,cx,dx,si,di,ds,es; } r;
  313.     char t[3];
  314.  
  315.     r.ax = 0x3700;
  316.     r.dx = 0;
  317.     sysint21(&r,&r);
  318.     t[0] = r.dx&0xff;
  319.     t[1] = '\0';
  320.     return(t);
  321. }
  322.  
  323. _cc(file)            /* compile file with current options */
  324. char *file;
  325. {
  326.     static char *passes[] = {"cc1 ","cc2 ","cc3 ","cc4 ","\0"};
  327.     int i,fr;
  328.     char comlin[255];
  329.     char ts[255];
  330.         
  331.     for (i=0;*passes[i] != '\0';i++) {
  332.         strcpy(comlin,passes[i]);        /* get pass */
  333.         if (i==0) {
  334.             strcat(comlin,copts);            /* add options on pass 1 */
  335.             strcat(comlin," ");
  336.         }
  337.         strcat(comlin,file);
  338.         puts(comlin);
  339.         fr=fork(comlin);
  340.         if (fr) {
  341.             fubar("error compiling: ",file);
  342.         }
  343.     }
  344. }
  345.  
  346. _as(file)            /* assemble file with current options */
  347. char *file;
  348. {
  349.     char comlin[255];
  350.     char ts[255];
  351.     int fr;
  352.  
  353.     strcpy(comlin,"masm ");
  354.     strcat(comlin,file);
  355.     strcat(comlin,",,");
  356.     if (*creffile != '\0') strcat(comlin,creffile);
  357.     else strcat(comlin,",");
  358.     strcat(comlin,aopts);
  359.     strcat(comlin,";");
  360.     puts(comlin);
  361.     if ((fr=fork(comlin)))    {
  362.         fubar("error assembling ",file);
  363.     }
  364. }
  365.  
  366. _link(out,filelist,nf)        /* link the files in filelist into out */
  367. char *out;
  368. char *filelist[];
  369. int nf;
  370. {
  371.     char comlin[255];
  372.     int i,fr;
  373.     char *ts;
  374.         
  375.     strcpy(comlin,"link ");
  376.     for (i=0;i<nf;i++) {
  377.         ts = strchr(filelist[i],'.');
  378.         *ts = '\0';
  379.         strcat(comlin,filelist[i]);
  380.         if (i < nf-1)                    /* don't want */
  381.             strcat(comlin,"+");        /* plus on last file in list */
  382.     }
  383.     strcat(comlin,",");
  384.     strcat(comlin,out);
  385.     strcat(comlin,",");
  386.     if (*mapfile != '\0') 
  387.         strcat(comlin,mapfile);
  388.     strcat(comlin,",");
  389.     if (libs[0] != '\0')            /* any user libs? */
  390.         strcat(comlin,libs);        /* add them */
  391.     if (cfb)                         /* big model? */
  392.         strcat(comlin,biglib);    /* add system library */
  393.     else
  394.         strcat(comlin,smllib);
  395.     strcat(comlin,lopts);        /* add linker options */
  396.     strcat(comlin,";");
  397.     puts(comlin);
  398.     fr=fork(comlin);
  399.     if (fr) {
  400.         fubar("error linking");
  401.     }
  402. }
  403.  
  404. readenv()            /* reads the environment variables */
  405. {
  406.     struct {int ax,bx,cx,dx,si,di,ds,es;} r;
  407.     char *ep,*envfind();
  408.     
  409.     if (ep = envfind("CCBLIB")) {
  410.         strcpy(biglib,ep);
  411.         free(ep);
  412.     }
  413.     if (ep = envfind("CCSLIB")) {
  414.         strcpy(smllib,ep);
  415.         free(ep);
  416.     }
  417.     if (ep = envfind("CCINCLUDES")) {
  418.         strcpy(include,ep);
  419.         free(ep);
  420.     }
  421. }
  422.  
  423. fubar(s,s2)
  424. char *s;
  425. char *s2;
  426. {
  427.     fputs("cc: ",stderr);
  428.     fputs(s,stderr);
  429.     puts(s2);
  430.     exit(1);
  431. }
  432.  
  433. usage()
  434. {
  435. puts("    usage: cc [flags] file ...");
  436. puts("    flags: all C86 flags are passed thru directly except -c.");
  437. puts("    ");
  438. puts("    -c      compile only, don't link                  ");
  439. puts("   -lpath  path/name of library to add to lib list");
  440. puts("    -C      nested comments (-c for compiler)");
  441. puts("    -ofile  name of output.exe, assumed first name in list");
  442. puts("    -Mfile  name of map file (linker)");
  443. puts("    -H      /h option (linker)");
  444. puts("    -D      /d option (linker)");
  445. puts("    -L      /l option (linker)");
  446. puts("    -P      /p option (linker)");
  447. puts("    -Ssize  /s option (linker)");
  448. puts("    -A      /a option (assembler)");
  449. puts("    -B      /d option (assembler)");
  450. puts("    -E      /e option (assembler)");
  451. puts("    -N      /n option (assembler)");
  452. puts("    -O      /o option (assembler)");
  453. puts("    -R      /r option (assembler)");
  454. puts("    -F      /X option (assembler)");
  455. puts("    -Xname  name for CREF file (assembler)");
  456. puts("");
  457. puts("    may have multiple files in list and they can contain");
  458. puts("    wildcards.");
  459. puts("");
  460. exit(1);
  461. }
  462.